Various assorted improvements to spawnveg #881
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Alterations:
spawnveg. This is the primary cause of a lockup in the pty tests occurring on Linux distributions using glibc 2.35+. The correct way to go about dealing withSIGT*is to set those toSIG_DFLin the child process; see_sh_fork()for a working example that doesn't lock up or produce segfaults. In this commit I duplicate_sh_fork's behavior inspawnvegfor theforkfallback and withPOSIX_SPAWN_SETSIGDEFfor theposix_spawnversion. The lockup can be reproduced as follows:tcsetpgrpto theforkfallback inspawnveg. Some form of this appears to have already been attempted in AT&T olden times, but that old version was broken and needed bugfixes desperately.tcsetpgrp, block the terminal signals in the parent process viasigcritical(). Theposix_spawnversion doesn't need this becauseposix_spawnwill usually block signals automatically and therefore doesn't needsigcritical.forkfallback forspawnvegworks correctly in interactive terminals, prefer that to thesh_fork()codepath on operating systems withoutposix_spawn_file_actions_addtcsetpgrp_np. Even though the underlying system call is still ultimatelyfork, thesh_ntfork()codepath is faster than the traditionalsh_fork()codepath. Benchmark (FreeBSD 14.2):spawnvegversions intospawnveg_fastandspawnveg_slow. Choose the appropriate one whenspawnvegis called; this removes the need for the xec.c ifdef hackery.ntfork_tcpgrpifdefs from xec.c;spawnvegcan handle it by itself now.spawnveg_fastandspawnveg_slowinnovation,spawnvegnow always has support forsetsid. It'll fallback to fork ifPOSIX_SPAWN_SETSIDisn't available.posix_spawnversion ofspawnveg, the flags should be of theshorttype pursuant to the POSIX specification.pipe2in theforkfallback forspawnvegwhen it's available to avoid twofcntlsyscalls.spawnvegdocumentation to reflect the new changes.